package com.company.sendemo.basics.amJavaCollection.javalist;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

public class ArraysListMethod {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        list.add("牛");
        list.add("强");
        list.add("牛");
        list.add("强");
        List<String> list1 = new ArrayList<>();
        list1.add("1");
        list1.add("2");
        list1.add("3");
        list1.add("4");
        list1.add("5");
        list1.add("6");
        List<String> list2 = new ArrayList<>();
        List<String> list3 = new ArrayList<>();
        list1.add("1");
        list1.add("2");
        list1.add("3");
        list1.add("10");
        list1.add("11");

        


//        A:添加功能
//        boolean add(E e):向集合中添加一个元素
//        void add(int index, E element):在指定位置添加元素
//        boolean addAll(Collection<? extends E> c)：向集合中添加一个集合的元素。
        System.out.println(list.add("4"));//true
        list.add(3,"3");  //没有返回值 不能打印
        System.out.println(list.addAll(2,list1));//true
        System.out.println(list.addAll(2,list2));//false

//        B:删除功能
//        void clear()：删除集合中的所有元素
//        E remove(int index)：根据指定索引删除元素，并把删除的元素返回
//        boolean remove(Object o)：从集合中删除指定的元素
//        boolean removeAll(Collection<?> c):从集合中删除一个指定的集合元素。
         //list.clear();
        System.out.println(list.remove(0));//打印被删除的数
        System.out.println(list.remove("牛"));//删除公共元素的第一个
        //removeAll在removeAll中

//        C:修改功能
//        E set(int index, E element):把指定索引位置的元素修改为指定的值，返回修改前的值。
        list.set(2, "你好");
        System.out.println(list);

//        D:获取功能
//        E get(int index)：获取指定位置的元素
//        Iterator iterator():就是用来获取集合中每一个元素。
//        Iterator iterator(int index)):和上面那个迭代器不同的就是多了一个参数，就是能控制迭代器开始的位置。
        System.out.println(list.get(2));//你好

//迭代器遍历集合：(ArrayList实际的跌倒器是Itr对象)
        Iterator<String> iterator =  list.iterator();
        while(iterator.hasNext()){
            String next = iterator.next();
            System.out.print("迭代  "+next);
        }
        System.out.println();

        //for循环迭代集合：
        for(String str:list){
            System.out.print("for  "+str);
        }




//        E:判断功能
//        boolean isEmpty()：判断集合是否为空。
//        boolean contains(Object o)：判断集合中是否存在指定的元素。
//        boolean containsAll(Collection<?> c)：判断集合中是否存在指定的一个集合中的元素。
        System.out.println(list.isEmpty());//false
        System.out.println(list.contains(4));//false
        System.out.println(list.containsAll(list3));//true

//        F:长度功能
//        int size():获取集合中的元素个数
        System.out.println(list.size());

//        G:把集合转换成数组
//        Object[] toArray():把集合变成数组
        String[] strArray = list.toArray(new String[]{});
        System.out.println(list.toString());

//        H.指定功能
//        int indexOf(Object o)
//        返回list集合中第一次出现o对象的索引位置，如果list集合中没有o对象，那么就返回-1
        System.out.println(list.indexOf("强"));//12
        System.out.println(list.indexOf(7));//-1

//        I、List<E> subList(int fromIndex, int toIndex)
//        返回从索引fromIndex到toIndex的元素集合，包左不包右
        System.out.println(list.subList(1, 12));




//3、查找新增的源码发现，其实在添加时只是计算对象的hash值。
//4、由于每次创建对象时hash值都不一样，所以每次都会当做新对象存起来。
//5、所以，现在我们必须保证两个对象的hash值相同，重写hashCode()。或equals
        HashSet set = new HashSet();

        //创建元素
        Student s1 = new Student("西门庆",20);
        Student s2 = new Student("武大郎",19);
        Student s3 = new Student("潘金莲",21);
        Student s4 = new Student("小龙女",23);
        Student s5 = new Student("武大郎",19);
        Student s6 = new Student("潘金莲",21);

        //添加时，新元素会和老元素比

        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        //默认：添加时查找对象的hash值，没有查到就存起来
        //所以必须让hash值一致才可以

        set.add(s5);
        set.add(s6);

        //问题1：属性相同时还是认为是两个对象...
        System.out.println(set);

        //     遍历
        Iterator it = set.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());

        }

    }
}
